iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

Android Architecture 及 Unit Test系列 第 9

[Day 9] Navigation Component:Part 2

  • 分享至 

  • xImage
  •  

今天我們來把側邊欄的功能完成,主要圍繞在 TasksActivity 上。

首先先看看完成後效果如何:

完成 TasksActivity

其實設置 Navigation Component 的整個過程中個人覺得 xml 的設置是最煩瑣的,設置完後在 Activity 這邊反而是比較簡單的。

先上程式碼:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tasks)
        
        initView()
    }

    private fun initView() {
        // 設置側邊欄
        setupNavigationDrawer()
        setSupportActionBar(findViewById(R.id.toolbar))

        val navController: NavController = findNavController(R.id.nav_host_fragment)
        appBarConfiguration = AppBarConfiguration.Builder(
            R.id.tasksFragment,
            R.id.statisticsFragment
        )
            .setDrawerLayout(drawerLayout)
            .build()
        setupActionBarWithNavController(navController, appBarConfiguration)
        findViewById<NavigationView>(R.id.nav_view)
            .setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration) ||
            super.onSupportNavigateUp()
    }

    private fun setupNavigationDrawer() {
        drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout).apply {
            setStatusBarBackground(R.color.colorPrimaryDark)
        }
    }

下面稍微解釋一下具體完成的步驟:

首先調用 Activity.findNavController() 來獲得對 NavController 的引用,事實上這其實是一個官方提供的 Extension,查看 Source code 可以發現其實要取得 NavController 不外乎就三種方式:

  • Fragment.findNavController()
  • View.findNavController()
  • Activity.findNavController(viewId: Int)

接下來要提到一個類: NavigationUI ,這是 Navigation Component 裡提供包含 ActionBar 、側邊欄及底部 Navigation 一些支援方法的 class。

要想在預設的 ActionBar 裡支援 navigation ,那麼就需要使用 setupActionBarWithNavController() 這個方法,可以注意到我們需要傳入一個叫 AppBarConfiguration 的 class ,這是 NavigationUI 配置 AppBar 設定的 class ,裡面實現了 Builder 模式供我們指定顯示的 DrawerLayout 並建立 AppBarConfiguration

Navigation 的 ActionBar 預設進入 Fragment 時上方的 menu 紐會變成一個返回鍵,要想禁用這個效果可以在他的 Builder 裡放入要保持原樣的 Fragment xml ,這邊我們讓兩個 Fragment 的 Menu 按鈕都保持原樣,在 Builder 的 constructor 裡放入 R.id.tasksFragmentR.id.statisticsFragment

再來 override onSupportNavigateUp() 讓返回鍵觸發時的行為可以依據 AppBarConfiguration 的設定來變化。

最後調用 NavigationUI.setupWithNavController() 讓 NavigationView 可以在 Navigation Component 改變 destination 時也有相應的變化。

Navigation Component 大致上已完成,明天開始建立 App 的 DB 。


上一篇
[Day 8] Navigation Component:Part 1
下一篇
[Day 10] Data layer with Room and repository pattern
系列文
Android Architecture 及 Unit Test30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言